package com.jinke.util;

import com.jinke.game.Bullet;

import java.awt.*;

public class BulletPool {
    // 对象池(单例模式)
    public static BulletPool instance = new BulletPool();
    // 对象池最大容量
    private static final int MAX_SIZE = 200;//我就不信有人能在这么小的矩形内开200个子弹
    // 对象池中的对象
    public Bullet[] bullets = new Bullet[MAX_SIZE];
    // 对象池中对象是否正在使用
    private boolean[] inUse = new boolean[MAX_SIZE];

    /**
     * 私有化构造器创建对象池,防止外部创建实例
     */
    private BulletPool (){
        //先在对象池初始化创建所有子弹对象
        for(int i = 0; i < MAX_SIZE; i++){
            bullets[i] = new Bullet();
        }
    }

    /**
     * 从对象池中获取子弹对象
     *
     * @param x           子弹的初始x坐标
     * @param y           子弹的初始y坐标
     * @param dir         子弹的初始方向
     * @param atk         子弹的攻击力
     * @param bulletColor
     * @return 获取到的子弹对象
     */
    public Bullet getBulletObj(int x, int y, int dir, int atk, Color bulletColor){
        for (int i = 0; i < MAX_SIZE; i++){
            if (!inUse[i]){
                inUse[i] = true;
                Bullet bullet = bullets[i];
                bullet.reset(x, y, dir, atk, bulletColor);//重置子弹对象(并不是重新回到0000的状态,而是重新设置属性)
                return bullet;
            }
        }
        // 对象池里的对象被拿完了,创建新的子弹对象
        System.out.println("对象池已满,创建新的子弹对象");
        return new Bullet(x, y, dir, atk, bulletColor);
    }

    /**
     * 归还子弹对象到对象池
     * @param bullet 归还的子弹对象
     */
    public void freeBulletObj(Bullet bullet){
        for (int i = 0; i < MAX_SIZE; i++){
            if (bullet == bullets[i]){
                inUse[i] = false;//归还对象
                break;
            }
        }
    }
}
